OpenClaw系列第18课:Cron 定时任务 - 让 AI 自动定时工作

OpenClaw系列第18课:Cron 定时任务 - 让 AI 自动定时工作
Kai这是「OpenClaw 教程课程」第 18 课。
前两课我们讲了多 Agent:第 16 课讲sessions_spawn,第 17 课讲subagents管理。今天进入自动化里最常用的一块:Cron 定时任务。

图:Cron 让 OpenClaw 可以在指定时间或固定周期自动唤醒 Agent,执行提醒、摘要、检查、报告等任务。
很多人第一次理解 OpenClaw 的自动化,会自然想到一句话:
“能不能让它每天自动帮我做点事?”
比如:
- 每天早上 8 点发一份晨报
- 每晚总结今天的任务
- 每周一检查项目状态
- 20 分钟后提醒我看某个文档
- 每隔一段时间跑一次健康检查
- 定时打开网页、收集信息、发回结果
这些事情,不应该靠你每天手动发消息。
也不应该让 Agent 在对话里傻等一个 sleep 3600。
在 OpenClaw 里,这类“到点自动执行”的工作,应该交给 Cron。
这一课我们讲清楚:
OpenClaw 的 Cron 是什么,怎么用,适合什么,不适合什么,以及怎样避免自动任务变成打扰。
一、Cron 是什么?
Cron 是 OpenClaw Gateway 内置的调度器。
文档里一句话说得很清楚:
Cron is the Gateway’s built-in scheduler.
翻译成新手能理解的话:
Cron 是 Gateway 里的定时任务系统。
它负责:
- 保存任务定义
- 在指定时间触发任务
- 唤醒 Agent
- 记录运行历史
- 必要时把结果发回聊天渠道或 webhook
这里有一个重点:
Cron 运行在 Gateway 里,不运行在模型里。
这意味着,模型不会一直“记着时间”等到点。
真正负责看时间、触发任务的是 Gateway。
到点以后,Gateway 再把任务交给 Agent 执行。
二、为什么不能让 Agent 自己等?
新手容易有一个错误想法:
1 | 让 AI 等 20 分钟后提醒我。 |
听起来可以,但技术上不应该这样做。
因为如果让 Agent 自己等,会出现很多问题:
- 占着当前对话运行
- 浪费模型或工具资源
- Gateway 重启后可能丢状态
- 无法稳定管理多个提醒
- 不好查看任务列表和历史
- 不能像真正调度器一样处理失败、重试和投递
所以正确做法是:
未来某个时间再做的事,交给 Cron。
这和第 12 课 exec 里讲过的原则一致:
不要用 sleep 循环模拟定时任务。
OpenClaw 已经有 Cron,就应该让 Gateway 调度。

图:sleep 只是让一个过程傻等;Cron 是 Gateway 持久化管理的调度系统,更适合提醒、周期任务和后台自动化。
三、Cron 适合做哪些事?
Cron 适合“明确时间触发”的任务。
1)一次性提醒
比如:
1 | 20 分钟后提醒我检查文章封面图。 |
或者:
1 | 明天上午 10 点提醒我发布第 18 课。 |
这类任务适合 one-shot job。
2)周期性摘要
比如:
- 每天早上发晨报
- 每晚总结今日任务
- 每周一发项目周报
- 每月 1 号整理账单提醒
这类任务适合 recurring job。
3)定时健康检查
比如:
- 每小时检查 Gateway 状态
- 每天检查磁盘空间
- 每周检查日志里有没有错误
这类任务可以结合 exec 做只读检查。
4)定时内容生产
比如:
- 每天生成一个教程选题
- 每周整理一篇阅读摘要
- 定时生成频道更新草稿
这类任务适合用 isolated session,避免污染主对话。
5)自动化报告
比如:
- 每天早上总结某个目录变化
- 每周检查文章是否缺 front matter
- 每天汇总昨天的任务结果
Cron 很适合“定时触发 + Agent 整理 + 发回结果”。
四、Cron 不适合做哪些事?
Cron 不是万能自动化。
下面这些情况不适合直接用 Cron。
1)需要实时连续监听的事情
比如:
1 | 一有新消息就马上处理。 |
这种更像 webhook、事件触发或 channel 消息处理。
Cron 是按时间触发,不是实时事件监听。
2)需要高频秒级循环的任务
比如每 5 秒检查一次状态。
这不适合 Cron,也不适合 Agent。
应该用专门监控系统,或者降低频率。
3)需要用户现场确认的敏感操作
比如:
- 到点自动删除文件
- 到点自动发公开消息
- 到点自动改生产配置
这些高风险动作不应该直接自动执行。
更好的做法是:
到点生成计划或提醒,由用户确认后再执行。
4)模糊目标
比如:
1 | 每天帮我做点有用的事。 |
这太模糊。
Cron 任务应该目标明确。
例如:
1 | 每天 9 点总结昨天 articles 目录新增或修改的 Markdown 文件,输出 5 条以内。 |
这样才可控。
五、Cron 的三种 schedule 类型
OpenClaw 文档里列了三种 schedule 类型:
| 类型 | CLI 参数 | 说明 |
|---|---|---|
at |
--at |
一次性时间点 |
every |
--every |
固定间隔 |
cron |
--cron |
cron 表达式 |
1)at:一次性任务
适合提醒。
比如:
1 | openclaw cron add \ |
这里 20m 就是 20 分钟后。
也可以用 ISO 时间,比如:
1 | 2026-02-01T16:00:00Z |
2)every:固定间隔
适合每隔一段时间做一次。
比如每小时、每 6 小时。
这种任务要谨慎,不要频率太高。
3)cron:标准 cron 表达式
适合复杂周期。
比如每天 7 点:
1 | 0 7 * * * |
每周一 9 点:
1 | 0 9 * * 1 |
Cron 表达式很强,但也容易写错。
新手刚开始可以优先用 --at 和简单 --cron。

图:OpenClaw Cron 支持一次性 at、固定间隔 every、标准 cron 表达式三类调度方式。
六、时区:一定要说清楚
时间任务最容易踩坑的是时区。
文档里提到:
没有 timezone 的 timestamp 会按 UTC 处理。
所以如果你想按本地时间执行,最好明确传 --tz。
比如北京时间:
1 | --tz "Asia/Shanghai" |
例如每天早上 8 点按北京时间跑:
1 | openclaw cron add \ |
不要只写“明早 8 点”,却不说时区。
尤其是服务器在 UTC、用户在中国时,非常容易差 8 小时。
七、执行位置:main / isolated / current / session:id
Cron 触发后,需要决定任务跑在哪个 session 里。
OpenClaw 文档里列了几种 --session:
| session | 含义 | 适合场景 |
|---|---|---|
main |
主会话 | 提醒、系统事件 |
isolated |
每次新建独立运行 | 报告、后台整理、自动化任务 |
current |
创建时绑定当前会话 | 和当前上下文相关的提醒 |
session:<id> |
指定持久会话 | 需要长期积累上下文的工作流 |
这部分非常关键。
因为不同 session 会影响:
- 是否继承上下文
- 是否污染主对话
- 是否适合长期积累
- 结果怎么投递
八、main session:适合提醒和系统事件
main 适合轻量提醒。
比如:
1 | openclaw cron add \ |
它更像:
到点往主会话塞一个系统事件,然后唤醒 Agent。
适合:
- 提醒你做某事
- 让主会话知道某个时间到了
- 简单唤醒
但不适合复杂后台分析。
复杂任务更推荐 isolated。
九、isolated session:适合后台报告
isolated 是自动化里非常常用的模式。
它的意思是:
每次 cron run 都在一个独立的新 session 里运行。
这有几个好处:
- 不污染主对话
- 每次运行上下文清爽
- 适合生成报告
- 适合跑后台检查
- 出问题也更容易隔离
例如每天早上生成晨报:
1 | openclaw cron add \ |
这里的重点是:
--session isolated:独立运行--message:给 Agent 的任务--announce:完成后投递结果--channel / --to:指定投递渠道和目标
新手可以先把 isolated 理解成:
让 cron 自己开一个干净的小房间做任务,做完把结果发回来。

图:main 适合提醒,isolated 适合后台报告,current 适合绑定当前上下文,session:id 适合长期持久工作流。
十、current session:绑定创建时的当前会话
current 的意思是:
创建 cron 任务时,把它绑定到当前会话。
适合这些场景:
- 当前对话里已经有上下文
- 你希望后续提醒和这个上下文有关
- 不是全局主会话,而是某个具体频道、群、线程或 direct chat
例如你正在某个项目对话里讨论 bug。
你可以说:
1 | 明天上午提醒我继续看这个 bug。 |
这类任务就可能适合 current。
但如果任务不需要当前上下文,isolated 更干净。
十一、session::适合长期积累上下文
session:<id> 是更进阶的用法。
它适合让某个定时任务长期在同一个命名 session 里积累上下文。
比如:
- daily-brief
- weekly-report
- health-check-history
这样每次运行都不是完全陌生的。
它可以基于前几次结果继续积累。
但也要注意:
长期 session 可能积累噪音,也可能让上下文越来越重。
所以对新手来说,默认还是 isolated 更稳。
十二、Delivery:结果怎么发回来?
Cron 任务执行完,结果要不要发回来、发到哪里,是 delivery 问题。
文档里提到三种模式:
| 模式 | 含义 |
|---|---|
announce |
如果 Agent 没直接发送,则 runner fallback 投递最终文本 |
webhook |
把完成事件 POST 到 URL |
none |
runner 不做 fallback 投递 |
新手先理解 announce 就够了。
announce
announce 表示任务完成后,把结果发回指定渠道。
例如:
1 | --announce --channel telegram --to "telegram:7995226813" |
如果你不想它主动发消息,可以用:
1 | --no-deliver |
这会关闭 runner fallback delivery。
但注意,isolated cron chat delivery 是 shared 的。
如果有可用聊天路由,Agent 自己仍可能使用 message 工具发送,具体要看任务和工具策略。
十三、Cron 会记录运行历史
Cron 不只是“到点跑一下”。
它还会记录任务和运行历史。
常用命令:
1 | openclaw cron list |
分别用于:
list:查看所有 cron jobsshow:查看某个 job 详情runs:查看某个 job 的运行历史
这对排错很重要。
比如你发现晨报没发出来,不要先猜。
先看:
1 | openclaw cron list |
确认它是没触发、触发失败、模型失败,还是投递失败。
十四、Cron 和 Background Tasks 的关系
第 16、17 课讲子 Agent 时,我们提到 background tasks。
Cron 也会创建 task 记录。
OpenClaw 文档里说:
All cron executions create background task records.
也就是说,每次 cron 执行,都会进入后台任务账本。
Background tasks 不是调度器。
它是记录:
- 什么任务跑过
- 是否 queued / running / succeeded / failed / timed_out / cancelled / lost
- 运行是否完成
- 是否投递成功
你可以理解成:
Cron 决定什么时候跑,Tasks 记录跑得怎么样。

图:Cron 是调度器,负责按时间触发;Background Tasks 是账本,负责记录后台执行状态和结果。
十五、失败、跳过和重试
Cron 任务不一定每次都成功。
可能出现:
- 模型不可用
- 本地 provider 没启动
- 工具被拒绝
- 任务超时
- 投递失败
- 网络问题
OpenClaw 对这些情况有一些保护。
文档里提到:
- recurring jobs 遇到连续错误会用指数退避
- skipped runs 和 execution errors 分开记录
- isolated cron 对本地 provider 会做轻量 preflight
- blocked command 不会被当成绿色成功
- timeout 会中止底层 agent run
新手不需要一次记住全部细节。
你先记住:
Cron 不只是定时触发,它还会记录成功、失败、跳过和超时。
排错时,先看 run history,而不是凭感觉猜。
十六、一个最小例子:20 分钟后提醒
假设你想 20 分钟后提醒自己检查文章。
可以这样:
1 | openclaw cron add \ |
解释一下:
--name:任务名--at "20m":20 分钟后--session main:发到主会话--system-event:到点注入的系统事件--wake now:唤醒处理--delete-after-run:成功后删除一次性任务
这是最适合理解 Cron 的例子。
它不是让 Agent 睡 20 分钟。
而是 Gateway 保存一个定时任务,到点再唤醒。
十七、一个实用例子:每天晨报
假设你想每天早上 8 点收到一个晨报。
可以用 isolated job:
1 | openclaw cron add \ |
这个例子里,最重要的是 --message 写得清楚。
定时任务不能太模糊。
不要写:
1 | 每天跟我说点东西。 |
要写:
1 | 控制在 5 条以内,优先总结重要事项、风险和下一步行动。 |
自动化任务越清楚,越不容易变成噪音。
十八、一个检查例子:每周检查文章格式
假设你维护一个文章目录。
可以每周检查一次:
1 | openclaw cron add \ |
这里有两个好习惯:
1)明确只读
1 | 只读检查,不要修改文件。 |
2)限制工具
1 | --tools read,exec |
这能减少不必要风险。
当然,具体工具是否可用还取决于你的工具策略配置。
十九、Cron 和 Heartbeat 有什么区别?
第 20 课会专门讲 Heartbeat。
这里先做一个最小区分。
Cron:到点做明确任务
比如:
- 每天 8 点发晨报
- 20 分钟后提醒
- 每周一检查文章
Cron 的特点是:
有明确时间或周期。
Heartbeat:保持 Agent 活跃和处理后台事件
Heartbeat 更像系统周期性检查和唤醒机制。
它适合保持 Agent 活跃,处理某些后台状态。
不是所有定时任务都应该塞进 Heartbeat。
新手先记住:
明确时间表用 Cron;保持活跃和后台节奏用 Heartbeat。
第 20 课我们会细讲。
二十、适合新手的 Cron 提问模板
下面这些句式可以直接复制。
1)一次性提醒
1 | 请帮我创建一个 20 分钟后的一次性提醒:提醒我检查第 18 课草稿。成功后自动删除任务。 |
2)每天晨报
1 | 请帮我创建一个每天北京时间早上 8 点的 isolated cron job,生成 5 条以内晨报,并发送到当前 Telegram 对话。 |
3)只读检查
1 | 请创建一个每周一北京时间 9 点的 isolated cron job,只读检查 articles 目录最近一周修改的 Markdown 文件,不要修改文件,只输出异常和建议。 |
4)不主动发消息
1 | 请创建 cron job,但不要主动投递结果,只保留运行记录供我之后查看。 |
5)排查 Cron
1 | 请帮我检查现有 cron job 列表、某个 job 的详情和最近运行历史,判断为什么没有发送结果。 |
6)避免打扰
1 | 这个 cron job 的输出请控制在 5 条以内;没有异常时只发送一句简短结果,不要长篇解释。 |
7)带时区
1 | 请按 Asia/Shanghai 时区创建任务,不要用 UTC 默认时间。 |
这些模板背后的重点是:
时间、会话、输出、投递、边界都要说清楚。

图:创建 Cron 任务时,要明确时间、时区、session、任务边界、输出长度和投递方式,避免自动任务变成噪音。
二十一、常见坑
坑 1:忘记时区
服务器常用 UTC。
用户想的是北京时间。
如果不写 --tz Asia/Shanghai,很容易错 8 小时。
坑 2:用 sleep 模拟定时任务
不要让 Agent 或 exec 等着未来时间。
未来任务用 Cron。
坑 3:任务描述太模糊
比如:
1 | 每天帮我总结一下。 |
总结什么?从哪里总结?发多长?发到哪里?
都不清楚。
坑 4:自动任务输出太长
定时任务如果每天发长篇,很快会变成噪音。
建议:
默认短输出,有异常再展开。
坑 5:让 Cron 自动做高风险写操作
比如自动删除、自动发布、自动改配置。
更安全的方式是:
Cron 到点生成计划或提醒,由人确认后执行。
坑 6:不知道跑在哪个 session
main、isolated、current、session:<id> 差别很大。
不确定时,后台报告优先 isolated。
坑 7:没看运行历史就猜问题
Cron 没按预期工作时,先看:
1 | openclaw cron list |
不要凭感觉改配置。
二十二、Cron 的安全原则
我建议记住这 6 条。
- 未来任务用 Cron,不用 sleep。
- 时间一定写清楚,尤其是时区。
- 后台报告优先 isolated。
- 自动输出要短,异常再展开。
- 高风险动作只提醒,不自动执行。
- 排错先看 job 和 run history。
这 6 条能避免大多数 Cron 使用问题。
二十三、这一课最值得记住的一句话
如果今天只记一句话,我建议你记这句:
Cron 不是让 AI 等时间,而是让 Gateway 到点唤醒 AI。
再补一句使用原则:
明确时间、明确任务、明确投递,自动化才不会变成打扰。
二十四、总结
今天这节课,我们讲清楚了 OpenClaw 的 Cron 定时任务:
- Cron 是 Gateway 内置的调度器。
- Cron 运行在 Gateway,不运行在模型里。
- 未来某个时间再做的事,应该交给 Cron,而不是 sleep。
- Cron 支持 at、every、cron 三类 schedule。
- 没有 timezone 的时间默认按 UTC,建议明确
--tz。 - main 适合提醒,isolated 适合后台报告,current 适合绑定当前上下文。
- announce 用于把结果投递回聊天渠道。
- Cron 每次执行都会创建 background task 记录。
- 排错时先看 cron list / show / runs。
- 定时任务要短、清楚、低打扰,高风险动作先让用户确认。
学会 Cron 后,OpenClaw 就不只是“你问它答”的助手了。
它开始能按时间主动做事:提醒、总结、检查、报告。
这就是自动化真正开始发生的地方。
下一课预告
下一课我们会讲:
第 19 课:Webhook / Hooks——外部事件触发 AI
也就是:
- Webhook 和 Cron 有什么区别
- 外部系统怎么触发 OpenClaw
- hooks/wake 和 hooks/agent 怎么理解
- token 和安全边界怎么设置
- 哪些场景适合事件触发而不是定时任务
🦞 本文由八条撰写,持续更新中。








